home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Texty / crackme / tut-fr.txt < prev    next >
Encoding:
Text File  |  1999-04-05  |  14.7 KB  |  391 lines

  1.  
  2.             Immortal Descendants CrackMe 4.0
  3.         Tutorial version 1.0 (4 avril 99) by Lucifer48
  4.                                          |
  5.                                          \---> O∙ comment occuper son Week-End de PΓques...
  6.  
  7. Outils utilisΘs: Soft-Ice v3.24
  8.  
  9. ===============
  10. 1. INTRODUCTION
  11. ===============
  12.  
  13. On s'introduit dans le code avec un bpx hmemcpy, quelques pressions de F12/F10 et:
  14.  
  15. XXXX:00402260  PUSH EBX                     ;handle de la fenΩtre du crackme
  16. XXXX:00402261  PUSH 0040BE28                ;serial
  17. XXXX:00402266  PUSH 0040BDE0                ;group
  18. XXXX:0040226B  PUSH 0040BF30                ;name
  19. XXXX:00402270  CALL 00401CF0                ;Tout est lα dedans
  20. XXXX:00402275  ADD  ESP,10                  ;dΘ-pop les 4 push
  21. XXXX:00402278  CMP  WORD PTR [0040BE20],28  ;Si on a FFFF, c'est que notre serial n'est pas le bon
  22. XXXX:00402280  JNZ  004022A0
  23.  
  24. On va donc explorer, ce call...
  25.  
  26. ==============================
  27. 2. JUSTE UN INSTANT DE PLUS...
  28. ==============================
  29.  
  30. Pour enlever la vΘrification du nombre d'essai, trois essais pour rΘsoudre ce crackme, c'est
  31. un peu juste. C'est assez simple:
  32.  
  33. XXXX:004022A0  MOV  AX,[0040A074]            ;nombre d'essai dΘjα effectuΘs
  34. XXXX:004022A6  INC  AX
  35. XXXX:004022A8  MOV  [0040A074],AX            ;sauvegarde
  36. XXXX:004022AE  CMP  AX,0003
  37. XXXX:004022B2  JNZ  004022E6                 ;3 essais = Boutton "Validate" dΘsactivΘ
  38.  
  39. On remplace le INC AX par deux NOP et c'est bon.
  40. Pour ceux qui aurait l'idΘe de remplacer AX pour une valeur supΘrieure α 3, TORN@DO a tout
  41. prΘvu; une MessageBox apparaεt:
  42.  
  43. "You're using a window editing tool like THE CUSTOMISER
  44.  You have had 3 chances for entering the right code!
  45.  Do you think that's fair?"
  46.  
  47. ==================
  48. 3. LET'S CMP [1/5]
  49. ==================
  50.  
  51. On entre donc dans le call 00401CF0
  52.  
  53. ...
  54. XXXX:00401CF9  CALL 004019F0                 ;courte procedure inutile
  55. XXXX:00401CFE  ADD  ESP,04                   ;instruction prΘfΘrΘe des compilateurs...
  56. XXXX:00401D01  PUSH EBX
  57. XXXX:00401D02  CALL 00401720                 ;α explorer absolument!
  58. XXXX:00401D07  ADD  ESP,04
  59. XXXX:00401D0A  CMP  EAX,01
  60. XXXX:00401D0D  JZ   00401D1D                 ;on doit avoir EAX=1 pour continuer
  61. XXXX:00401D0F  MOV  WORD PTR [0040BE20],FFFF ;mauvais serial, si on passe par ici
  62. ...
  63. XXXX:00401D1C  RET                           ;retour
  64.  
  65. On doit sortir du CALL 00401720 avec EAX=1:
  66.  
  67. XXXX:00401722  MOV   ESI,[ESP+0C]            ;ESI pointe vers notre serial
  68. XXXX:00401726  PUSH  EDI
  69. XXXX:00401727  MOV   AL,[ESI+01]             ;lecture du 2Φme caractΦre
  70. XXXX:0040172A  MOV   CL,[ESI+02]             ;lecture du 3Φme caractΦre
  71. XXXX:0040172D  XOR   AL,49
  72. XXXX:0040172F  XOR   CL,44
  73. XXXX:00401732  MOVSX EAX,AL
  74. XXXX:00401735  MOV   DL,[ESI+03]             ;lecture du 4Φme caractΦre
  75. XXXX:00401738  MOV   BL,[ESI]                :lecture du 1er caractΦre
  76. XXXX:0040173A  XOR   DL,39
  77. XXXX:0040173D  XOR   BL,54
  78. XXXX:00401740  MOVSX ECX,CL
  79. XXXX:00401743  MOVSX EDI,DL
  80. XXXX:00401746  MOV   DL,[ESI+04]             ;lecture du 5Φme caractΦre
  81. XXXX;00401749  XOR   DL,39
  82.  
  83. AprΦs il s'en suit cinq comparaisons, s'il elles sont vΘrifiΘes alors EAX=1 sinom EAX=0.
  84. CMP BL,1D  ( 1D XOR 54 = 49 [I] )
  85. CMP EAX,0D ( 0D XOR 49 = 44 [D] )
  86. CMP ECX,07 ( 07 XOR 44 = 43 [C] )
  87. CMP EDI,0D ( 0D XOR 39 = 34 [4] )
  88. CMP EDX,09 ( 09 XOR 39 = 30 [0] )
  89.  
  90. fin du CALL 00401720, le dΘbut du serial est donc IDC40.
  91. On poursuit en 00401D1D.
  92.  
  93. ================================
  94. 4. LET'S CMP [2/5] : XOR MON AMI
  95. ================================
  96.  
  97. XXXX:00401D2D  CALL  00401A20                 ;100% inutile
  98. XXXX:00401D32  ADD   ESP,10
  99. XXXX:00401D35  PUSH  EBX
  100. XXXX:00401D36  CALL  00401790
  101. XXXX:00401D3B  ADD   ESP,10
  102. XXXX:00401D3E  CMP   EAX,01
  103. XXXX:00401D41  JZ    00401D51                 ;comme tout α l'heure...
  104. XXXX:00401D43  MOV   WORD PTR [0040BE20];FFFF ;mauvais serial...
  105. ...
  106. XXXX:00401D50  RET                            ;retour
  107.  
  108. Notre mission: sortir du call 00401790 avec EAX=01.
  109.  
  110. XXXX:00401790  MOV   EAX,[ESP+04]             ;EAX pointe vers notre serial
  111. XXXX:00401794  PUSH  EBX
  112. XXXX:00401795  PUSH  ESI
  113. XXXX:00401796  MOV   CL,[EAX+07]              ;lecture du 8Φme caractΦre
  114. XXXX:00401799  XOR   CL,52
  115. XXXX:0040179C  MOV   DL,[EAX+08]              :lecture du 9Φme caractΦre
  116. XXXX:0040179F  XOR   DL,45
  117. XXXX:004017A2  MOV   BL,[EAX+09]              ;lecture du 10Φme caractΦre
  118. XXXX:004017A5  XOR   BL,53
  119. XXXX:004017A8  MOV   AL,[EAX+06]              :lecture du 7Φme caractΦre
  120. XXXX:004017AB  MOVSX ECX,CL
  121. XXXX:004017AE  MOVSX EDX,DL
  122. XXXX:004017B1  MOVSX ESI,BL
  123. XXXX:004017B4  XOR   AL,54
  124.  
  125. AprΦs, encore quelques comparaisons:
  126. CMP AL,11  ( 11 XOR 54 = 45 [E] )
  127. CMP ECX,06 ( 06 XOR 52 = 54 [T] )
  128. CMP EDX,07 ( 07 XOR 45 = 42 [B] )
  129. CMP ESI,1F ( 1F XOR 53 = 4C [L] )
  130.  
  131. fin du call 00401790, avec EAX=1
  132. Notre serial ressemnble a un truc du genre IDC40*ETBL***...
  133. "*" dΘsigne (pour l'instant) un caractΦre quelconque.
  134. On continue en XXXX:00401D51.
  135.  
  136. ============================
  137. 5. LET'S CMP [3/5] : LA DATE
  138. ============================
  139.  
  140. XXXX:00401D51  PUSH EBX
  141. XXXX:00401D52  CALL 004017E0                  ;α explorer
  142. XXXX:00401D57  ADD  ESP,04
  143. XXXX:00401D5A  CMP  EAX,01
  144. XXXX:00401D5D  JZ   00401D6D
  145. XXXX:00401D5F  MOV  DWORD PTR [0040BE20],FFFF
  146. ...
  147. XXXX:00401D6C  RET                            :retour
  148.  
  149. On doit (encore) sortir avec EAX=1 du CALL 004017E0.
  150.  
  151. ...
  152. XXXX:00401851  PUSH  EAX                      ;pointe vers les 4 derniers caractΦres du mon serial
  153. XXXX:00401852  CALL  00403480                 ;conversion hΘxadΘcimale rΘsultat dans EAX.
  154. XXXX:00401857  ADD   ESP,04
  155. XXXX:0040185A  MOV   ESI,EAX                  ;sauvegarde du rΘsultat de la conversion
  156. XXXX:0040185C  CALL  004016A0                 ;α explorer! (on s'amuse avec l'horloge)
  157. XXXX:00401861  SUB   EAX,ESI
  158. XXXX:00401863  POP   EDI
  159. XXXX:00401864  POP   ESI
  160. XXXX:00401865  CMP   EAX,01
  161. XXXX:00401868  SBB   EAX,EAX                  ;il faut que CF=1
  162. XXXX:0040186A  ADD   ESP,04
  163. XXXX:0040186D  NEG   EAX                      ;NEG FFFFFFFF = 00000001
  164. XXXX:0040186F  RET
  165.  
  166. Explorons le call 004016A0:
  167.  
  168. XXXX:004016A8  PUSH  EAX
  169. XXXX:004016A9  CALL  [KERNEL32!GetLocalTime]  ;dΘcidΘment c'est une manie chez TORN@DO...
  170. XXXX:004016AF  XOR   EDX,EDX
  171. XXXX:004016B1  XOR   EAX,EAX
  172. XXXX:004016B3  MOV   DX,[ESP+06]              ;mois
  173. XXXX:004016B8  XOR   ECX,ECX
  174. XXXX:004016BA  MOV   AX,[ESP+0A]              ;jour du mois
  175. XXXX:004016BF  IMUL  EDX,EAX
  176. XXXX:004016C2  MOV   CX,[ESP+0E]              ;minute
  177. XXXX:004016C7  MOV   EAX,[ESP+0C]             ;heure
  178. XXXX:004016CB  AND   EAX,0000FFFF
  179. XXXX:004016D0  IMUL  EAX,ECX
  180. XXXX:004016D3  MOVSX ECX,BYTE PTR [0040BF60]  ;1Φre lettre de (*)
  181. XXXX:004016DA  ADD   EDX,EAX
  182. XXXX:004016DC  MOV   EAX,[ESP+04]             ;annΘe
  183. XXXX:004016E0  SUB   EDX,ECX
  184. XXXX:004016E2  AND   EAX,0000FFFF
  185. XXXX:004016E7  LEA   ESI,[EAX+EDX]
  186. XXXX:004016EA  PUSH  ESI                      ;sauvegarde du prΘcieux rΘsultat
  187. XXXX:004016EB  CALL  00401290                 ;Soft Ice (pour win95/98) installΘ ?
  188. XXXX:004016F0  ADD   ESP,04
  189. XXXX:004016F3  TEST  EAX,EAX
  190. XXXX:004016F5  JZ    004016FD
  191. XXXX:004016F7  ADD   ESI,00000143             ;si "si95" est installΘ ESI=ESI+143
  192. XXXX:004016FD  PUSH  ESI
  193. XXXX:004016FE  CALL  004012D0                 ;Soft Ice (pour winNT) installΘ ?
  194. XXXX:00401703  ADD   ESP,04
  195. XXXX:00401706  TEST  EAX,EAX
  196. XXXX:00401708  JZ    00401710
  197. XXXX:0040170A  ADD   ESI,00000271             ;si "siNT" est installΘ ESI=ESI+143
  198. XXXX:00401710  MOV   EAX,ESI
  199. XXXX:00401712  POP   ESI
  200. XXXX:00401713  ADD   ESP,10
  201. XXXX:00401716  RET                            ;retour
  202.  
  203. (*)
  204. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
  205. "RegisteredOwner"="LuCiFeR48"
  206.  
  207.  
  208. Ainsi nos 4 derniers caractΦres de notre serial correspond uniquement α l'encryptage de la
  209. date et savoir si Soft Ice est installΘ.
  210. Il y a un nouveau serial chaque minute!
  211.  
  212. On continue donc en XXXX:00401D6D
  213.  
  214. ======================================================
  215. 6. LET'S CMP [4/5] : LA DATE D'INSTALLATION DE WINDOWS
  216. ======================================================
  217.  
  218. XXXX:00401D71  CALL  00401B70                 ;inutile
  219. XXXX:00401D76  ADD   ESP,10
  220. XXXX:00401D79  MOV   EAX,[0040C380]
  221. XXXX:00401D7E  PUSH  EAX
  222. XXXX:00401D7F  PUSH  EBX
  223. XXXX:00401D80  CALL  00401870                 ;α explorer
  224. XXXX:00401D85  ADD   ESP,08
  225. XXXX:00401D88  CMP   EAX,01
  226. XXXX:00401D8B  JZ    00401D9B                 ;encore une fois EAX doit valoir 1
  227. XXXX:00401D8D  MOV   WORD PTR [0040BE20],FFFF
  228. ...
  229. XXXX:00401D9A  RET                            ;retour (mauvais cracker!)
  230.  
  231. Explorons le call 00401870:
  232.  
  233. (**) copie le serial α partir du 6Φme caractΦre au 12Φme (inclus) soit 7 chiffres.
  234. ...
  235. XXXX:004018BB  LEA  EAX,[ESP+10]             ;pointe vers notre serial un peu dΘcoupΘ! (**)
  236. ...                                          ;qui est ensuite converti en hexa
  237. XXXX:004018EE  CALL  00403559                ;gΘnΦre un nombre hΘxa
  238. XXXX:004018F3  SUB   EAX,ESI                 ;on doit avoir EAX=ESI pour que τa marche
  239. XXXX:004018F5  POP   EBP
  240. XXXX:004018F6  POP   EDI
  241. XXXX:004018F7  CMP   EAX,01
  242. XXXX:004018FA  SBB   EAX,EAX
  243. XXXX:004018FC  POP   ESI
  244. XXXX:004018FD  NEG   EAX
  245. XXXX:004018FF  POP   EBX
  246. XXXX:00401900  ADD   ESP,64
  247. XXXX:00401803  RET                           ;fin du call 00401870
  248.  
  249. Un petit mot sur le call 00403559
  250. ...
  251. XXXX:004018CA  MOV   EAX,[0040BEFC]                  ;(#)
  252. XXXX:004018CF  MOV   [ESP+10],EAX
  253. XXXX:004018D3  MOV   DWORD PTR [ESP+14],00000000
  254. XXXX:004018DB  FILD  QWORD PTR [ESP+10]              ;
  255. XXXX:004018E1  CALL  00403559                        ;
  256. XXXX:004018E6  FMUL  REAL8 PTR [00409020]            ; Je comprends pas ces lignes
  257. XXXX:004018EC  FSUBP ST(1),ST                        ;
  258. XXXX:004018EE  CALL  0040264C                        ;
  259. XXXX:004018F3  SUB   EAX,ESI                         ;soustrait le rΘsultat avec notre conversion
  260. ...
  261.                RET
  262.  
  263. (#) d'ou vient ce nombre. Au dΘpart, τa vient des quatres octets lus en
  264. [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
  265. FirstInstallDateTime
  266. LΘgΦre modification via:
  267. XXXX:00401E70  MOV   EBP,[USER32!wsprintfA]
  268. XXXX:00401E76  PUSH  EAX                      ;les 4 octets de "FirstInstallDateTime"
  269. XXXX:00401E77  PUSH  0040A6C8
  270. XXXX:00401E7C  PUSH  0040BF90                 ;emplacement du rΘsultat
  271. XXXX:00401E81  CALL  EBP
  272.  
  273. Il faut que ce qui sort du call 00403559, soit votre valeur converti en dΘcimal prΘsent dans votre
  274. serial.
  275.  
  276. Petit rΘcapitulatif:
  277. Exemple, pour moi: IDC40-ETBL22226617393-xxxx
  278.                    ----- ----    ------- ----
  279. LET'S CMP          [1/5] ----    ------- ----
  280. partie:                  [2/5]   ------- ----
  281.                                   [4/5]  ----
  282.                                          [3/5]
  283.  
  284. -: caractΦre quelconque.
  285. xxxx: α remplacer par le rΘsultat de l'encodage de la date (change chaque minute)
  286.       mettre un BPX 00401865 et taper R EAX=0, et zou...
  287.  
  288. et on continue en XXXX:00401D9B
  289.  
  290. =========================================
  291. 7. LET'S CMP [5/5] : Encrytion Name+Group
  292. =========================================
  293.  
  294. XXXX:00401D9F  CALL 00401C30                 ;inutile
  295. XXXX:00401DA4  ADD  ESP,10
  296. XXXX:00401DA7  PUSH EBX
  297. XXXX:00401DA8  CALL 00401910                 ;α explorer
  298. XXXX:00401DAD  ADD  ESP,04
  299. XXXX:00401DB0  CMP  EAX,01
  300. XXXX:00401DB3  JZ   00401DC3                 ;youpiiii! le cracke est fini!
  301. XXXX:00401DB5  MOV  WORD PTR [0040BE20],FFFF
  302. ...
  303. XXXX:00401DC2  RET
  304.  
  305. En XXXX:00401DC3, on est arrivΘ α la fin du crackme.
  306. Mais avant...il y le call 00401910 a explorer...
  307.  
  308. ...
  309. XXXX:00401972  LEA  EDX,[ESP+08]            ;pointe vers une partie de mon serial (***)
  310. XXXX:00401976  PUSH EAX
  311. XXXX:00401977  CALL 00403480                ;conversion hexa (rΘsultat dans EAX)
  312. XXXX:0040197C  ADD  ESP,04                  ;depop l'argument
  313. XXXX:0040197F  MOV  EDI,EAX                 ;sauvegarde du prΘcieux rΘsultat en EDI
  314. XXXX:00401981  CALL 00401590                ;sort un nombre hΘxa en EAX (petite addition)
  315. XXXX:00401986  MOV  ESI,EAX
  316. XXXX:00401988  CALL 00401540                ;sort un nombre hΘxa en EAX (manip du "RegisteredOwner")
  317. XXXX:0040198D  XOR  ESI,EAX
  318. XXXX:0040198F  PUSH 0040BDE0                ;group
  319. XXXX:00401994  PUSH 0040BF30                ;nom
  320. XXXX:00401999  CALL 004015E0
  321. XXXX:0040199E  ADD  ESP,08
  322. XXXX:004019A1  ADD  EAX,ESI
  323. juste aprΦs:
  324. EAX=EAX*DB (on multiplie EAX par 219)
  325. ECX=4*ECX
  326. ECX=ECX-EAX
  327. ECX=64*ECX
  328. ECX=ECX-EAX
  329. ECX=2*ECX
  330. XXXX:004019B8  MOV [ESP+08],ECX
  331.  
  332. (***) Forme dΘfinitive du serial:
  333. IDC40-ETBL-24654564564-6617393-xxxx
  334.            -----------
  335. LET'S CMP    [5/5]
  336.            En 00401972, EDX va pointer vers 24654564564.
  337.  
  338. | A propos du call 00401540, sa fonction est simple, il additionne tout les caractΦres du
  339. | "RegisteredOwner" (sauf le dernier).
  340. | Exmple pour moi:
  341. | ------IDCRKME40!.data+1F60----------------------------------------------------- 
  342. | XXXX:0040BF60  4C 75 43 69 46 65 52 34 38 00 00 00 00 00 00 00  LuCiFeR48......
  343. |
  344. | 4C+75+43+69+46+65+52+34 = 29E = rΘsultat de EAX
  345.  
  346. | A propos encore du call 00401590, sa fonction est encore plus simple, chaque numΘro du caractΦre
  347. | du "RegisteredOwner" (sauf le dernier) est multipliΘ par 2 et additionnΘ ensuite avec les autres.
  348. | Exemple: 1*2 + 2*2 + 3*2 + 4*2 + 5*2 + 6*2 + 7*2 + 8*2 = (1+2+3+4+5+6+7+8)*2 = 24*2 = 48
  349. | Soit plus symboliquement: si n est la longueur de la chaine du "RegisteredOwner"
  350. | On obtient la formule: (n-1)*n
  351. | Taille de "LuCiFeR48" = 9 et donc 9*8=48
  352. | Remarque (quasi Θvidente): tous les calculs sont en hΘxa.
  353.  
  354. Quelques mots sur le call 004015E0,
  355. PremiΦre encryption du nom; chaque caractΦre (sauf le dernier) est multipliΘ par A29, et on
  356. additionne tout τa. On ajoute ensuite les valeurs ascii qui composent le group (sauf le dernier)
  357. Cette valeur est en ensuite multipliΘ par B (=11)
  358.  
  359. [...]
  360.  
  361. ...
  362. XXXX:004019C4  FILD   QWORD PTR [ESP+08]       ;
  363. XXXX:004019C8  FLD    ST(0)                    ;
  364. XXXX:004019CA  FSIN                            ; Je comprends pas ces lignes
  365. XXXX:004019CC  FMUL   REAL8 PTR [00409028]     ;
  366. XXXX:004019D2  FSUBP  ST(1),ST                 ;
  367. XXXX:004019D4  CALL   0040264C                 ;
  368. XXXX:004019D9  SUB    EAX,EDI                  ;soustrait le rΘsultat avec notre conversion
  369. ...
  370. XXXX:004019DD  CMP    EAX,01                   ;EAX=00 = bon serial!
  371. XXXX:004019E0  SBB    EAX,EAX
  372. XXXX:004019E2  ADD    ESP,64
  373. XXXX:004019E5  NEG    EAX
  374. XXXX:004019E7  RET
  375.  
  376.  
  377. =====================================
  378. 8. AU FINAL : MON SERIAL SUR MESURE !
  379. =====================================
  380.  
  381. Name: Lucifer48
  382. Group: None
  383. Serial: IDC40-ETBL-605573733-6617393-xxxx
  384.  
  385. xxxx: remplacer par la date encrytΘe (partie 5. LET'S CMP [3/5] : LA DATE)
  386.  
  387. /* FirstInstallDateTime: E1 B1 39 25
  388.    RegisteredOwner: LuCiFeR48
  389. */
  390.  
  391.